﻿using System.ComponentModel.DataAnnotations;
using System.Linq.Expressions;
using ExpressionBuilder.Common;

namespace ExpressionBuilder.Interfaces
{
    /// <summary>
    /// Define an operation.
    /// </summary>
    public interface IOperation
    {
        /// <summary>
        ///操作名称（也用作标识符）。
        /// </summary>
        string Name { get; }

        /// <summary>
        /// 手术分为类型组。
        /// </summary>
        TypeGroup TypeGroup { get; }

        /// <summary>
        /// 操作支持的值数。
        /// </summary>
        [Range(0, 2)]
        int NumberOfValues { get; }

        /// <summary>
        ///确定操作是否处于活动状态（默认值为true）。
        /// </summary>
        bool Active { get; set; }

        /// <summary>
        /// 确定操作是否支持列表。
        /// </summary>
        bool SupportsLists { get; }

        /// <summary>
        ///确定此操作是否希望在其值中出现空值。
        /// </summary>
        bool ExpectNullValues { get; }

        /// <summary>
        /// 返回通过此操作生成的表达式。
        /// </summary>
        /// <param name="member">Member access expression</param>
        /// <param name="constant1">The operation's first constant value.</param>
        /// <param name="constant2">The operation's second constant value.</param>
        /// <returns></returns>
        Expression GetExpression(MemberExpression member, ConstantExpression constant1, ConstantExpression constant2);

        /// <summary>
        /// 返回操作的字符串表示形式。
        /// </summary>
        string ToString();
    }
}